package com.test.design_pattern.template;

/**
 * 模板抽象类
 */
public abstract class AbstractTemplate {

    /**
     * 模板方法
     * 一个模板方法是定义在抽象类中的，把基本操作方法组合在一起形成一个总算法或一个总行为的方法。
     * 一个抽象类可以有任意多个模板方法，而不限于一个。每一个模板方法都可以调用任意多个具体方法。
     */
    public void templateMethod(){
        //调用基本方法
        abstractMethod();
        hookMethod();
        concreteMethod();
    }

    /**
     * 基本方法(抽象方法)的声明（由子类实现）
     * 一个抽象方法由抽象类声明，由具体子类实现
     */
    protected abstract void abstractMethod();

    /**
     * 基本方法(空方法)(钩子方法)
     * 一个钩子方法由抽象类声明并实现，而子类会加以扩展。通常抽象类给出的实现是一个空实现，作为方法的默认实现。
     *
     * 一个钩子方法常常由抽象类给出一个空实现作为此方法的默认实现。这种空的钩子方法叫做“Do Nothing Hook”。
     * 显然，这种默认钩子方法在缺省适配模式里面已经见过了，一个缺省适配模式讲的是一个类为一个接口提供一个默认的空实现，
     * 从而使得缺省适配类的子类不必像实现接口那样必须给出所有方法的实现，因为通常一个具体类并不需要所有的方法。
     */
    protected void hookMethod(){

    }

    /**
     * 基本方法（已经实现）
     * 一个具体方法由抽象类声明并实现，而子类并不实现或置换。
     * 11111111111
     * 22222222222
     */
    private final void concreteMethod(){
        //业务相关的代码
    }
}